home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / gfx / show / svoUtah22.lha / svoUtahRLE / source / URT / lib / rle_putcom.c < prev    next >
C/C++ Source or Header  |  1990-08-02  |  4KB  |  171 lines

  1. /*
  2.  * This software is copyrighted as noted below.  It may be freely copied,
  3.  * modified, and redistributed, provided that the copyright notice is 
  4.  * preserved on all copies.
  5.  * 
  6.  * There is no warranty or other guarantee of fitness for this software,
  7.  * it is provided solely "as is".  Bug reports or fixes may be sent
  8.  * to the author, who may or may not act on them as he desires.
  9.  *
  10.  * You may not include this software in a program or other software product
  11.  * without supplying the source, or without informing the end-user that the 
  12.  * source is available for no extra charge.
  13.  *
  14.  * If you modify this software, you should include a notice giving the
  15.  * name of the person performing the modification, the date of modification,
  16.  * and the reason for such modification.
  17.  */
  18. /* 
  19.  * rle_putcom.c - Add a picture comment to the header struct.
  20.  * 
  21.  * Author:    Spencer W. Thomas
  22.  *         Computer Science Dept.
  23.  *         University of Utah
  24.  * Date:    Mon Feb  2 1987
  25.  * Copyright (c) 1987, University of Utah
  26.  */
  27.  
  28. #include <stdio.h>
  29. #include <rle.h>
  30. #ifdef VOID_STAR
  31. void *malloc();
  32. #else
  33. char *malloc();
  34. #endif
  35.  
  36. /*****************************************************************
  37.  * TAG( match )
  38.  * 
  39.  * Match a name against a test string for "name=value" or "name".
  40.  * If it matches name=value, return pointer to value part, if just
  41.  * name, return pointer to NUL at end of string.  If no match, return NULL.
  42.  *
  43.  * Inputs:
  44.  *     n:    Name to match.  May also be "name=value" to make it easier
  45.  *        to replace comments.
  46.  *    v:    Test string.
  47.  * Outputs:
  48.  *     Returns pointer as above.
  49.  * Assumptions:
  50.  *    [None]
  51.  * Algorithm:
  52.  *    [None]
  53.  */
  54. static char *
  55. match( n, v )
  56. register char *n;
  57. register char *v;
  58. {
  59.     for ( ; *n != '\0' && *n != '=' && *n == *v; n++, v++ )
  60.     ;
  61.     if (*n == '\0' || *n == '=')
  62.     if ( *v == '\0' )
  63.         return v;
  64.     else if ( *v == '=' )
  65.         return ++v;
  66.  
  67.     return NULL;
  68. }
  69.  
  70. /*****************************************************************
  71.  * TAG( rle_putcom )
  72.  * 
  73.  * Put a comment into the header struct.
  74.  * Inputs:
  75.  *     value:        Value to add to comments.
  76.  *    the_hdr:    Header struct to add to.
  77.  * Outputs:
  78.  *     the_hdr:    Modified header struct.
  79.  *    Returns previous value;
  80.  * Assumptions:
  81.  *     value pointer can be used as is (data is NOT copied).
  82.  * Algorithm:
  83.  *     Find match if any, else add at end (realloc to make bigger).
  84.  */
  85. CONST_DECL char *
  86. rle_putcom( value, the_hdr )
  87. CONST_DECL char * value;
  88. rle_hdr * the_hdr;
  89. {
  90.     register CONST_DECL char ** cp, ** old_comments;
  91.     CONST_DECL char * v;
  92.     int i;
  93.  
  94.     if ( the_hdr->comments == NULL )
  95.     {
  96.     the_hdr->comments = (CONST_DECL char **)malloc( 2 * sizeof(char *) );
  97.     the_hdr->comments[0] = value;
  98.     the_hdr->comments[1] = NULL;
  99.     }
  100.     else
  101.     {
  102.     for ( i = 2, cp = the_hdr->comments; *cp != NULL; i++, cp++ )
  103.         if ( match( value, *cp ) != NULL )
  104.         {
  105.         v = *cp;
  106.         *cp = value;
  107.         return v;
  108.         }
  109.     /* Not found */
  110.     /* Can't realloc because somebody else might be pointing to this
  111.      * comments block.  Of course, if this were true, then the
  112.      * assignment above would change the comments for two headers.
  113.      * But at least, that won't crash the program.  Realloc will.
  114.      * This would work a lot better in C++, where hdr1 = hdr2
  115.      * could copy the pointers, too.
  116.      */
  117.     old_comments = the_hdr->comments;
  118.     the_hdr->comments = (CONST_DECL char **)malloc(i * sizeof(char *) );
  119.     the_hdr->comments[--i] = NULL;
  120.     the_hdr->comments[--i] = value;
  121.     for ( i--; i >= 0; i-- )
  122.         the_hdr->comments[i] = old_comments[i];
  123.     }
  124.  
  125.     return NULL;
  126. }
  127.  
  128. /*****************************************************************
  129.  * TAG( rle_delcom )
  130.  * 
  131.  * Delete a comment from header struct.
  132.  * Inputs:
  133.  *     name:        Name of comment to delete.
  134.  *    the_hdr:    Header to delete comment from.
  135.  * Outputs:
  136.  *     the_hdr:    Modified header struct.
  137.  *    Returns original comment value.
  138.  * Assumptions:
  139.  *    [None]
  140.  * Algorithm:
  141.  *    [None]
  142.  */
  143. CONST_DECL char *
  144. rle_delcom( name, the_hdr )
  145. CONST_DECL char * name;
  146. rle_hdr *the_hdr ;
  147. {
  148.     register CONST_DECL char ** cp;
  149.     CONST_DECL char * v = NULL;
  150.  
  151.     if ( the_hdr->comments == NULL )
  152.     return NULL;
  153.     else
  154.     {
  155.     for ( cp = the_hdr->comments; *cp != NULL; cp++ )
  156.         if ( match( name, *cp ) != NULL )
  157.         {
  158.         v = *cp;
  159.         for ( ; *cp != NULL; cp++ )
  160.             *cp = cp[1];
  161.         break;
  162.         }
  163.     /* Not found */
  164.     }
  165.  
  166.     if ( *the_hdr->comments == NULL )
  167.     the_hdr->comments = NULL;
  168.  
  169.     return v;
  170. }
  171.